package com.koron.common.core.business.todoApproval.templates;

import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;

import java.util.Date;
import java.util.List;

/**
 * @author jzp
 * @since 2023/8/7
 */
public interface TodoApprovalModel {

    /**
     * 发起待办
     */
    String startTodo(String bizId, String title, String link, String mobileLink, List<String> accounts, String createBy, Date date, String modelName);

    /**
     * 发送待办
     *
     * @param bizId    业务id
     * @param title    业务标题
     * @param link     链接
     * @param accounts 处理人
     * @param createBy 创建人
     * @param date     创建时间
     * @return 处理结果
     */
    String sendTodo(String bizId, String title, String link, String mobileLink, List<String> accounts, String createBy, Date date, String modelName);

    /**
     * 删除待办
     *
     * @param bizId 业务id
     * @return 处理结果
     */
    String deleteTodo(String bizId, String modelName);

    /**
     * 删除指定待办所属人操作 (不会真正删除待办，对待办所属人做已办处理)
     *
     * @param bizId    业务id
     * @param accounts 待办所属人
     * @return 处理结果
     */
    String deleteTodo(String bizId, List<String> accounts, String modelName);

    /**
     * 设待办为已办
     *
     * @param bizId 业务id
     * @return 处理结果
     */
    String setTodoDone(String bizId, List<String> accounts, String modelName);

    /**
     * 设置目标待办所属人为已办
     *
     * @param bizId    业务id
     * @param accounts 待办所属人
     * @return 处理结果
     */
    String setAccountsTodoDone(String bizId, List<String> accounts, String modelName);

    /**
     * 获取待办已办数据
     *
     * @param accounts  用户
     * @param rowSize
     * @param pageNo
     * @param type      0表示待办 -1表示已办
     * @param subject   标题
     * @param beginTime
     * @param endTime
     * @return 处理结果
     */
    String getTodo(List<String> accounts, String rowSize, String pageNo, Integer type, String subject, String beginTime, String endTime, String modelName);

    /**
     * 获取当前账号的待办数据
     *
     * @param accounts 用户
     * @param modelId  业务id
     * @return 处理结果
     */
    String getAccountTodo(List<String> accounts, String modelId, String modelName);

    default String sendRequest(String suffixUrl, String paramStr) {
        HttpResponse response = HttpRequest.post(getRequestUrl(suffixUrl))
                .header(Header.AUTHORIZATION, getAuthorization())//头信息，多个头信息多次调用此方法即可
                .body(JSONUtil.toJsonStr(paramStr))//表单内容
                .timeout(20000)//超时，毫秒
                .execute();
        return response.body();
    }

    /**
     * 提供验证头，例如：
     *  Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
     * @return 验证头
     */
    String getAuthorization();

    /**
     * 获取待办URL
     * @return 后缀
     */
    String getRequestUrl(String suffixUrl);

}
